package br.com.foxinline.servico;

import br.com.foxinline.enums.TipoAverbacao;
import br.com.foxinline.enums.TipoRequerimento;
import br.com.foxinline.generico.ServicoGenerico;
import br.com.foxinline.modelo.CaixaRequerimento;
import java.math.BigDecimal;
import java.util.Date;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author elyjunior
 */
@Stateless
public class CaixaRequerimentoServico extends ServicoGenerico<CaixaRequerimento> {

    public CaixaRequerimentoServico() {
        super(CaixaRequerimento.class);
    }

    @Override
    public void save(CaixaRequerimento caixaReq) {
        super.save(caixaReq);
    }

    public Long qtdTipoRequerimento(TipoRequerimento tipoRequerimento, Date data) {
        String sql = "SELECT count(c.id) FROM CaixaRequerimento c WHERE c.tipoRequerimento = :tipoRequerimento "
                + " AND c.dataEntrada = :data";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("tipoRequerimento", tipoRequerimento);
        query.setParameter("data", data);
        return (Long) query.getSingleResult();
    }
    
    public Long qtdTipoAverbacao(TipoAverbacao tipoAverbacao, Date data) {
        String sql = "SELECT count(c.id) FROM CaixaRequerimento c WHERE  "
                + "  c.tipoAverbacao like :tipoAverbacao AND c.dataEntrada = :data";
        Query query = getEntityManager().createQuery(sql);
        
        query.setParameter("tipoAverbacao", "%"+tipoAverbacao.name()+"%");
        query.setParameter("data", data);
        return (Long) query.getSingleResult();
    }

    public Long qtdTipoRequerimento(TipoRequerimento tipoRequerimento, Date dataIni, Date dataFim) {
        String sql = "SELECT count(c.id) FROM CaixaRequerimento c WHERE c.tipoRequerimento = :tipoRequerimento "
                + " AND c.dataEntrada between :dataIni and :dataFim";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("tipoRequerimento", tipoRequerimento);
        query.setParameter("dataIni", dataIni);
        query.setParameter("dataFim", dataFim);
        return (Long) query.getSingleResult();
    }
    
    public Long qtdTipoAverbacao(TipoAverbacao tipoAverbacao, Date dataIni, Date dataFim) {
        String sql = "SELECT count(c.id) FROM CaixaRequerimento c WHERE c.tipoAverbacao like :tipoAverbacao "
                + " AND c.dataEntrada between :dataIni and :dataFim";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("tipoAverbacao", "%"+tipoAverbacao.name()+"%");
        query.setParameter("dataIni", dataIni);
        query.setParameter("dataFim", dataFim);
        return (Long) query.getSingleResult();
    }

    public BigDecimal qtdSomaTipoRequerimento(TipoRequerimento tipoRequerimento, Date data) {
        String sql = "SELECT SUM(c.valor) FROM CaixaRequerimento c WHERE c.tipoRequerimento = :tipoRequerimento"
                + " AND c.dataEntrada = :data ";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("tipoRequerimento", tipoRequerimento);
        query.setParameter("data", data);

        BigDecimal result = (BigDecimal) query.getSingleResult();

        if (result == null) {
            return new BigDecimal(0);
        }

        return result;
    }
    
    public BigDecimal qtdSomaTipoAverbacao(TipoAverbacao tipoAverbacao, Date data) {
        String sql = "SELECT SUM(c.valor) FROM CaixaRequerimento c WHERE "
                + " c.tipoAverbacao like :tipoAverbacao AND c.dataEntrada = :data ";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("tipoAverbacao", "%"+tipoAverbacao.name()+"%");
        query.setParameter("data", data);

        BigDecimal result = (BigDecimal) query.getSingleResult();

        if (result == null) {
            return new BigDecimal(0);
        }

        return result;
    }

    public BigDecimal qtdSomaTipoRequerimento(TipoRequerimento tipoRequerimento, Date dataIni, Date dataFim) {
        String sql = "SELECT SUM(c.valor) FROM CaixaRequerimento c WHERE c.tipoRequerimento = :tipoRequerimento"
                + " AND c.dataEntrada between :dataIni and :dataFim ";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("tipoRequerimento", tipoRequerimento);
        query.setParameter("dataIni", dataIni);
        query.setParameter("dataFim", dataFim);

        BigDecimal result = (BigDecimal) query.getSingleResult();

        if (result == null) {
            return new BigDecimal(0);
        }

        return result;
    }
    
    
    public BigDecimal qtdSomaTipoAverbacao(TipoAverbacao tipoAverbacao, Date dataIni, Date dataFim) {
        String sql = "SELECT SUM(c.valor) FROM CaixaRequerimento c WHERE c.tipoAverbacao like :tipoAverbacao"
                + " AND c.dataEntrada between :dataIni and :dataFim ";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("tipoAverbacao", "%"+tipoAverbacao.name()+"%");
        query.setParameter("dataIni", dataIni);
        query.setParameter("dataFim", dataFim);

        BigDecimal result = (BigDecimal) query.getSingleResult();

        if (result == null) {
            return new BigDecimal(0);
        }

        return result;
    }
    
    
//     public CaixaRequerimento valorCaixaRequerimento(Requerimento requerimento) {
//        CaixaRequerimento caixaRequerimento;
//        String sql = "Select c from Requerimento r " 
//                + "JOIN r.caixaRequerimento c WHERE r.id = :id";
//        Query query = getEntityManager().createQuery(sql);
//        query.setParameter("id", requerimento.getId());
//        List result = query.getResultList();
//        try {
//            if (result != null && !result.isEmpty()) {
//                caixaRequerimento = (CaixaRequerimento) result.get(0);
//            } else {
//                caixaRequerimento = null;
//            }
//
//        } catch (NoResultException nr) {
//            nr.printStackTrace();
//            return null;
//        } catch (NonUniqueResultException nre) {
//            nre.printStackTrace();
//            return null;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return null;
//        }
//        return caixaRequerimento;
//    }
}
